//==============================================================================================
/**
 * @file	snd_play.h
 * @brief	サウンド再生関数
 * @author	Satoshi Nohara
 * @date	2005.06.09
 *
 * 関連ファイル snd_tool.h
 */
//==============================================================================================

//==============================================================================================
//
//	extern宣言
//
//==============================================================================================

//==============================================================================================
//
//	BGM関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	BANK_BASICで作成したBGM再生(全てロード済みデータを再生)
 *
 * @param	no		BGMナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 *
 * データのロード処理が入りません。通常は使用しません。
 */
//--------------------------------------------------------------
extern BOOL Snd_BgmPlayBasicData( u16 no );

//--------------------------------------------------------------
/**
 * @brief	BGM再生(SEの上に積んだデータを開放して、BGMデータのロードを行う)
 *
 * @param	no		BGMナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
extern BOOL Snd_BgmPlay( u16 no );

//--------------------------------------------------------------
/**
 * @brief	演出BGM再生(ライバル、サポート、つれてけ)
 *
 * @param	no		BGMナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 *
 * 連れ歩きBGMなどで使用する！
 */
//--------------------------------------------------------------
extern BOOL Snd_PlayerFieldDemoBgmPlay( u16 no );

//--------------------------------------------------------------
/**
 * @brief	BGM停止
 *
 * @param	no		BGMナンバー
 * @param	frame	指定したフレーム数かけて徐々に音量を落としていく
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_BgmStop( u16 no, int frame );

//--------------------------------------------------------------
/**
 * @brief	シーケンスフェードイン(BGMのみ)(シーン定義はsnd_tool.h参照)
 *
 * @param	vol		フェードイン後のボリューム(0-127)
 * @param	frame	フレーム数
 * @param	flag	"BGM_FADEIN_START_VOL_NOW = 現在の音量からFADEIN"
 * @param	(flag)	"BGM_FADEIN_START_VOL_MIN = 音量0からFADEIN"
 *
 * @retval	none
 *
 * フェードカウンターをセットしています
 */
//--------------------------------------------------------------
extern void Snd_BgmFadeIn( int vol, int frame, int flag );

//--------------------------------------------------------------
/**
 * @brief	シーケンスフェードアウト(BGMのみ)(シーン定義はsnd_tool.h参照)
 *
 * @param	vol		フェードアウト後のボリューム(0-127)
 * @param	frame	フレーム数
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_BgmFadeOut( int vol, int frame );

//--------------------------------------------------------------
/**
 * @brief	フェード終了待ち
 *
 * @param	none
 *
 * @retval	"0=終了、0以外はフェードカウンターの値"
 */
//--------------------------------------------------------------
extern int Snd_FadeCheck();

//--------------------------------------------------------------
/**
 * @brief	BGM終了待ち
 *
 * @param	no		BGMナンバー
 *
 * @retval	"再生中=TRUE、再生終了=FALSE"
 */
//--------------------------------------------------------------
extern int Snd_BgmPlayCheck( u16 no );

//--------------------------------------------------------------
/**
 * @brief	全ての再生中のシーケンスを停止
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_Stop(void);

//--------------------------------------------------------------
/**
 * @brief	フィールドBGM以外の全ての再生中のシーケンスを停止
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_StopEx(void);


//==============================================================================================
//
//	SE関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	SE再生 + パン操作
 *
 * @param	no		SEナンバー
 * @param	pan		-128 〜 127
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
extern BOOL Snd_SePlayPan( u16 no, int pan );

//--------------------------------------------------------------
/**
 * @brief	SE再生
 *
 * @param	no		SEナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
extern BOOL Snd_SePlay( u16 no );

//--------------------------------------------------------------
/**
 * @brief	SE再生(指定したプレイヤーナンバーで再生)
 *
 * @param	no			SEナンバー
 * @param	playerNo	プレイヤーナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
extern BOOL Snd_SePlayEx( u16 no, int playerNo );

//--------------------------------------------------------------
/**
 * @brief	SE再生(ゾーンBGMのバンクを使用してSEを再生する)
 *
 * @param	no			SEナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
BOOL Snd_SePlay_ZoneBgmBank( u16 no );

//--------------------------------------------------------------
/**
 * @brief	SE停止(シーケンスナンバー指定版)
 *
 * @param	no		SE番号
 * @param	frame	指定したフレーム数かけて徐々に音量を落としていく
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_SeStopBySeqNo( u16 no, int frame );


//--------------------------------------------------------------
/**
 * @brief	SE再生
 *
 * @param	no		SEナンバー
 * @param	pitch	音程(-32767〜32768) ノーマルは0
 *                  64で半音上がる
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
extern BOOL Snd_SePitchPlay( u16 no, s16 pitch );

//--------------------------------------------------------------
/**
 * @brief	ボリューム指定付きSE再生
 *
 * @param	no		SEナンバー
 * @param	vol		ボリューム( -723 〜 0 )(0.1db単位)
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
extern BOOL Snd_SePlayVol( u16 no, int vol );


//--------------------------------------------------------------
/**
 * @brief	SE停止(シーケンスナンバー指定版)
 *
 * @param	no		SE番号
 * @param	frame	指定したフレーム数かけて徐々に音量を落としていく
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_SeStopBySeqNo( u16 no, int frame );

//--------------------------------------------------------------
/**
 * @brief	SE停止(サウンドハンドル指定版)
 *
 * @param	type	サウンドハンドルタイプ
 * @param	frame	指定したフレーム数かけて徐々に音量を落としていく
 *
 * @retval	none
 *
 * サウンドハンドルが無効の場合は、何もしません。
 */
//--------------------------------------------------------------
extern void Snd_SeStop( int type, int frame );

//--------------------------------------------------------------
/**
 * @brief	全てのSE停止
 *
 * @param	frame	指定したフレーム数かけて徐々に音量を落としていく
 *
 * @retval	none
 *
 * サウンドハンドルが無効の場合は、何もしません。
 */
//--------------------------------------------------------------
extern void Snd_SeStopAll( int frame );
//--------------------------------------------------------------
/**
 * @brief	SE終了待ち
 *
 * @param	no		SEナンバー
 *
 * @retval	"再生中=TRUE、再生終了=FALSE"
 *
 * 指定したSEが終了しているかチェックではなく、
 * 指定したSEの使用するプレイヤーに、
 * 再生中のシーケンスがあるかのチェックです。
 */
//--------------------------------------------------------------
extern int Snd_SePlayCheck(u16 no);

//--------------------------------------------------------------
/**
 * @brief	SE終了待ち(PLAYER指定版)
 *
 * @param	playerNo		PLAYERナンバー
 *
 * @retval	"再生中=TRUE、再生終了=FALSE"
 *
 * 指定したSEが終了しているかチェックではなく、
 * 指定したSEの使用するプレイヤーに、
 * 再生中のシーケンスがあるかのチェックです。
 */
//--------------------------------------------------------------
extern int Snd_SePlayCheckByPlayerNo( u16 playerNo );

//--------------------------------------------------------------
/**
 * @brief	全てのSE終了待ち
 *
 * @param	none
 *
 * @retval	"再生中=TRUE、再生終了=FALSE"
 */
//--------------------------------------------------------------
extern int Snd_SePlayCheckAll();

//--------------------------------------------------------------
/**
 * @brief	SEのPAN(定位)を変更
 *
 * @param	no		SEナンバー
 * @param	bitmask	トラックビットマスク
 * @param	pan		-128 〜 127
 *
 * @retval	none
 *
 * trackBitMaskで、設定するトラックを指定します。
 * 下位ビットから順に、トラック0、トラック1、トラック2、、、を表し、
 * ビットが立っているトラック全てに対して、パンを変更します。
 *
 * 例えば、トラック2とトラック5のパンを変更したい場合は、
 * (1 << 2) | (1 << 5) すなわち、0x0024 とします。
 */
//--------------------------------------------------------------
extern void Snd_SePanSet( u16 no, u16 bitmask, int pan );

//--------------------------------------------------------------
/**
 * @brief	PAN(定位)を変更(PLAYER指定)
 *
 * @param	playerNo	プレイヤーナンバー
 * @param	pan			-128 〜 127
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PanSetByPlayerNo( u16 playerNo, int pan );

//--------------------------------------------------------------
/**
 * @brief	全てのSEのPAN(定位)を変更
 *
 * @param	pan		-128 〜 127
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_SePanSetAll( int pan );


//==============================================================================================
//
//	ポケモン鳴き声関連
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	ポケモン鳴き声再生(内部で再生前に停止が呼ばれます)
 *
 * @param	monsno	ポケモンナンバー
 * @param	form_no	フォルムナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 *
 * 例外として、コーラスを使用する時は、停止は呼ばれません。
 *
 * ポケモンナンバーと、鳴き声シーケンスデータの並びが同じか確認する！
 * (全国図鑑ナンバーに対応しているらしい。050722一之瀬さんより)
 *
 * <メモ>
 * シーケンスアーカイブだと、プレイヤーヒープが使えない！
 * シーケンスだと、プレイヤーヒープが使える！
 */
//--------------------------------------------------------------
extern BOOL Snd_PMVoicePlay( u16 monsno, u8 form_no );

//--------------------------------------------------------------
/**
 * @brief	ポケモン鳴き声再生(ウェイト指定あり)
 *
 * @param	monsno	ポケモンナンバー
 * @param	wait	ウェイト
 * @param	form_no	フォルムナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 */
//--------------------------------------------------------------
extern BOOL Snd_PMVoiceWaitPlay( u16 monsno, u8 wait, u8 form_no );

//--------------------------------------------------------------
/**
 * @brief	ポケモン鳴き声停止(サウンドハンドル指定版)
 *
 * @param	p		サウンドハンドルのアドレス
 * @param	frame	指定したフレーム数かけて徐々に音量を落としていく
 *
 * @retval	none
 *
 * サウンドハンドルが無効の場合は、何もしません。
 *
 * コーラス(鳴き声専用)サウンドハンドルも停止させています。
 */
//--------------------------------------------------------------
extern void Snd_PMVoiceStop( int frame );

//--------------------------------------------------------------
/**
 * @brief	ポケモン鳴き声終了待ち
 *
 * @param	none
 *
 * @retval	"再生中=1以上、再生終了=0"
 */
//--------------------------------------------------------------
extern int Snd_PMVoicePlayCheck(void);

//--------------------------------------------------------------
/**
 * @brief	ポケモン鳴き声パターンセット
 *
 * @param	ptn		パターン(snd_tool.h参照)
 * @param	monsno	ポケモンナンバー
 * @param	pan		-128 〜 127
 * @param	vol		ボリューム(0-127)
 * @param	heap_id	ヒープID
 * @param	form_no	フォルムナンバー
 *
 * @retval	"成功=TRUE、失敗=FALSE"
 *
 * 使用していない引数には、"PV_PTN_PARAM_NONE"を渡しておいて下さい
 */
//--------------------------------------------------------------
extern BOOL Snd_PMVoicePlayEx( int ptn, u16 monsno, int pan, int vol, int heap_id, u8 form_no );

//--------------------------------------------------------------
/**
 * @brief	ウェイトをセットして指定したポケモン鳴き声を再生
 *
 * @param	ptn		パターン(snd_tool.h参照)
 * @param	monsno	ポケモンナンバー
 * @param	pan		-128 〜 127
 * @param	vol		ボリューム(0-127)
 * @param	heap_id	ヒープID
 * @param	wait	ウェイト
 * @param	form_no	フォルムナンバー
 *
 * @retval	none
 *
 * ポケモンアニメしながら鳴き声を再生する時に呼ばれるので、
 * バトルの登場などで使用するので、パターン、パンなどの情報が必要になる
 */
//--------------------------------------------------------------
extern void Snd_PMVoiceWaitPlayEx( int ptn, u16 monsno, int pan, int vol, int heap_id, u8 wait, u8 form_no );

//--------------------------------------------------------------
/**
 * @brief	ポケモン鳴き声情報をクリア
 *
 * @param	none
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PMVoiceWorkClear( void );

//--------------------------------------------------------------
/**
 * @brief	図鑑コーラス再生
 *
 * @param	no			ポケモンナンバー
 * @param	chorus_vol	コーラスチャンネルボリューム(0-127)
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PMVoicePlayPtn_ZukanChorus( u16 no, int chorus_vol );


//==============================================================================================
//
//	ME関連
//	BGMの波形のみ開放して大丈夫(入れないと容量足りないか確認)
//
//	使用例1(ME終了後、共通ウェイトをセットしてBGM再開)
//	Snd_MePlay(bgm,&wk)
//	if( Snd_MePlayCheckBgmPlay(&wk) == FALSE ){
//
//	使用例2(ME終了後、すぐBGM再開)
//	Snd_MePlay(bgm,&wk)
//	wk = 0;
//	if( Snd_MePlayCheckBgmPlay(&wk) == FALSE ){
//
//	使用例3(ME終了後、ウェイトを指定してBGM再開)
//	Snd_MePlay(bgm,&wk)
//	wk = 120;
//	if( Snd_MePlayCheckBgmPlay(&wk) == FALSE ){
//
//==============================================================================================

//--------------------------------------------------------------
/**
 * @brief	BGMポーズ → ME再生
 *
 * @param	no			MEナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 *
 * ウェイトワークにME共通ウェイト値がセットされます
 */
//--------------------------------------------------------------
extern BOOL Snd_MePlay( u16 no );

//--------------------------------------------------------------
/**
 * @brief	ME終了待ち
 *
 * @param	none
 *
 * @retval	"再生中=TRUE、再生終了=FALSE"
 */
//--------------------------------------------------------------
extern int Snd_MePlayCheck(void);

//--------------------------------------------------------------
/**
 * @brief	ME停止
 *
 * @param	frame	指定したフレーム数かけて徐々に音量を落としていく
 *
 * @retval	none
 *
 * サウンドハンドルが無効の場合は、何もしません。
 */
//--------------------------------------------------------------
//extern void Snd_MeStop( int frame );

//--------------------------------------------------------------
/**
 * @brief	ME終了待ち → 終了後、ウェイトを入れてからBGMを復帰させる
 *
 * @param	none
 *
 * @retval	"ME再生中=TRUE、ウェイト中=TRUE、BGM再開=FALSE"
 */
//--------------------------------------------------------------
extern int Snd_MePlayCheckBgmPlay(void);


//--------------------------------------------------------------
/**
 * @brief   現在再生しているBGMのボリュームを変更する
 *
 * @param   volume		BGMのボリューム（デフォは127）
 *
 * @retval  BOOL		成功:1　失敗:0
 */
//--------------------------------------------------------------
extern BOOL Snd_BgmVolumeChange( u16 volume );


//==============================================================================================
//
//	使わないかも。。。
//
//==============================================================================================
#if 0
//--------------------------------------------------------------
/**
 * @brief	BGMデータをロード
 *
 * @param	no		BGMナンバー
 *
 * @retval	"成功=TRUE、失敗=FALSE"
 *
 * 使用例(1)	マップデータから取得したBGMデータをロードする
 * Snd_HeapLoadState( SEロード後の階層ナンバー );	//BGMを開放
 * Snd_LoadBgm( map->bgm );							//BGMロード
 *
 * 使用例(2)	指定したBGMデータをロードする
 * Snd_HeapLoadState( SEロード後の階層ナンバー );	//BGMを開放
 * Snd_LoadBgm( SEQ_DOORO_X3 );						//BGMロード
 *
 * 道路、町の境目では、BGMデータのみロードすることになるので、
 * SE、BGMの順にデータをロードするようにして、BGMを開放、ロードという流れにする
 */
//--------------------------------------------------------------
extern int Snd_LoadBgm( u16 no );

//--------------------------------------------------------------
/**
 * @brief	手持ちポケモン鳴き声ロード
 *
 * @param	none
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 *
 * 階層保存はしていない！
 */
//--------------------------------------------------------------
extern int Snd_LoadTemotiPMVoice();

//--------------------------------------------------------------
/**
 * @brief	指定したポケモン鳴き声ロード
 *
 * @param	no		ポケモンナンバー
 *
 * @retval	"再生成功=TRUE、失敗=FALSE"
 *
 * 階層保存はしていない！
 */
//--------------------------------------------------------------
extern int Snd_LoadPMVoice( u16 no );

//--------------------------------------------------------------
/**
 * @brief	フェード終了待ち
 *
 * @param	none
 *
 * @retval	"再生終了=0、0以外はフェードカウンターの値"
 *
 * フェードカウンターを減らす処理をしています
 */
//--------------------------------------------------------------
extern int Snd_BgmFadeCheck(void);

//--------------------------------------------------------------
/**
 * @brief	ポケモン鳴き声停止(シーケンスナンバー指定版)
 *
 * @param	no		BGM番号
 * @param	frame	指定したフレーム数かけて徐々に音量を落としていく
 *
 * @retval	none
 */
//--------------------------------------------------------------
extern void Snd_PMVoiceStopBySeqNo( u16 no, int frame );




#endif


